package com.leo.common;

import jakarta.activation.DataHandler;
import jakarta.activation.FileDataSource;
import jakarta.mail.Message;
import jakarta.mail.Session;
import jakarta.mail.Transport;
import jakarta.mail.internet.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.Date;
import java.util.Properties;

@Slf4j
public class SMTPSendUtil {
    /**
     * @param fromEmail      登录用户名
     * @param password       登录密码
     * @param fromNickname   发件人昵称
     * @param toEmail        收件人邮箱
     * @param toNickname     收件人昵称
     * @param toTheme        邮件主题
     * @param content        邮件内容
     * @param attachmentPath 附件路径
     */
    public static void sendEmail(String fromEmail, String password, String fromNickname, String toEmail, String toNickname, String toTheme, String content, String attachmentPath) {

        log.info("开始发送邮件");

        //创建参数配置, 用于连接邮件服务器的参数配置
        Properties props = new Properties();
        // 使用的协议（JavaMail规范要求）
        props.setProperty("mail.transport.protocol", "smtp");
        // 发件人的邮箱的 SMTP 服务器地址
        if (fromEmail.contains("@qq")) {
            props.setProperty("mail.smtp.host", "smtp.qq.com");
        } else if (fromEmail.contains("@163")) {
            props.setProperty("mail.smtp.host", "smtp.163.com");
        }
        // 需要请求认证
        props.setProperty("mail.smtp.auth", "true");

        //创建会话
        Session session = Session.getDefaultInstance(props);

        try {
            //创建邮件
            //创建邮件对象
            MimeMessage message = new MimeMessage(session);

            //From: 发件人
            message.setFrom(new InternetAddress(fromEmail, fromNickname, "UTF-8"));

            //To: 收件人
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmail, toNickname, "UTF-8"));

            //Subject: 邮件主题
            message.setSubject(toTheme, "UTF-8");

            //Content: 邮件内容
            //一个一个Multipart对象包含一个或多个bodypart对象，组成邮件正文
            MimeMultipart multipart = new MimeMultipart();
            //创建文本节点
            MimeBodyPart text = new MimeBodyPart();
            text.setContent(content, "text/html;charset=UTF-8");

            if (StringUtils.isNotBlank(attachmentPath)) {
                String[] attachSplit = attachmentPath.split(";");
                for (String filePath : attachSplit) {
                    //创建附件结点
                    MimeBodyPart file = new MimeBodyPart();
                    DataHandler dataHandler = new DataHandler(new FileDataSource(filePath));
                    file.setDataHandler(dataHandler);
                    file.setFileName(MimeUtility.encodeText(dataHandler.getName()));
                    multipart.addBodyPart(file);
                }

                //将text和file添加到multipat
                multipart.addBodyPart(text);
                multipart.setSubType("mixed");  //混合关系
            } else {
                //将text添加到multipat
                multipart.addBodyPart(text);
                multipart.setSubType("mixed");  //混合关系
            }

            message.setContent(multipart);
            message.setSentDate(new Date());
            message.saveChanges();

            Transport transport = session.getTransport("smtp");
            //使用 邮箱账号 和 密码 连接邮件服务器
            transport.connect(fromEmail, password);

            //发送邮件
            transport.sendMessage(message, message.getAllRecipients());

            // 关闭连接
            transport.close();

            log.info("邮件发送成功");
        } catch (Exception e) {
            log.error("邮件发送异常:{}", e.getMessage());
        }
    }

}
